
import pymysql
import pandas as pd
from datetime import datetime


def load_douyin_data():
    """加载抖音平台数据"""
    douyin_files = [
        (r'G:\工作\2025年订单\9月\抖音1.xlsx', '抖音1'),
        (r'G:\工作\2025年订单\9月\抖音2.xlsx', '抖音2'),
        (r'G:\工作\2025年订单\9月\抖音3.xlsx', '抖音3'),
        (r'G:\工作\2025年订单\9月\抖音4.xlsx', '抖音4')
    ]

    douyin_dfs = []
    for file_path, platform in douyin_files:
        df = pd.read_excel(file_path, dtype={
            '主订单编号': str, '子订单编号': str, '商品ID': str,
            '达人昵称': str, '选购商品': str, '达人ID': str
        })
        df['平台'] = platform
        douyin_dfs.append(df)

    return pd.concat(douyin_dfs)


def classify_channel(x, y, z, w, m, p):
    """渠道分类函数
    x: 选购商品, y: 达人ID, z: 流量来源, w: 广告渠道, m: 商品ID, p: 平台
    """
    # 代播
    if 'zs2' in x or 'zz' in x or 'zs' in x:
        return '代播1'
    elif y in ['3503512424549920', '4178614898921144']:
        return '代播1'

    # 自播
    elif y == '4393240679422429' or 'z1' in x or 'Z1' in x:
        return '自播1'
    elif y == '2572502459235059' or 'z3' in x or 'Z3' in x:
        return '自播3'
    elif y == '3087847281658366' or 'z5' in x or 'Z5' in x:
        return '自播5'
    elif y == '246753999456383' or 'z8' in x or 'Z8' in x:
        return '自播8'
    elif 'wzm' in x:
        return '自播1'
    elif y == '4167563789207568' or 'lsf' in x:
        return '螺蛳土豆粉直播间'
    elif p == '抖音1' and 'dsp' in x:
        return '自播1'
    elif p == '抖音2' and 'dsp' in x:
        return '自播5'
    elif p == '抖音3' and 'dsp' in x:
        return '自播8'
    elif p == '抖音4' and 'dsp' in x:
        return '螺蛳土豆粉直播间'

    # 其他渠道
    elif y != '0':
        return '招商'
    elif z == '精选联盟':
        return '招商'
    elif w == '商品卡':
        return '商品卡'
    else:
        return '自然单'


def check_cooker_gift(x, y):
    """检查是否为电煮锅赠品
    x: 选购商品, y: 商品规格
    """
    if '电煮锅' in x or '电煮锅' in y or '拉面锅' in x or '拉面锅' in y:
        return '电煮锅赠品'
    return None


def process_data(dou):
    """数据处理和清洗"""
    # 数据预处理
    dou['达人ID'] = dou['达人ID'].str.strip()
    dou['订单提交时间'] = pd.to_datetime(dou['订单提交时间'])
    dou['时'] = dou['订单提交时间'].map(lambda x: x.hour)
    dou['日期'] = dou['订单提交时间'].map(lambda x: datetime.date(x))
    dou['支付完成时间'] = dou['支付完成时间'].fillna(value='1998-01-01 00:00:00')
    dou['发货时间'] = dou['发货时间'].fillna(value='1998-01-01 00:00:00')

    # 渠道分类
    dou['渠道'] = list(map(classify_channel,
                           list(dou['选购商品']),
                           list(dou['达人ID']),
                           list(dou['流量来源']),
                           list(dou['广告渠道']),
                           list(dou['商品ID']),
                           list(dou['平台'])))

    # 电煮锅标识
    dou['电煮锅'] = list(map(check_cooker_gift,
                             list(dou['选购商品']),
                             list(dou['商品规格'])))

    # 提取需要的列
    dou_date = dou.loc[:, [
        '平台', '日期', '时', '订单提交时间', '主订单编号', '子订单编号', '选购商品', '商品规格',
        '商品数量', '商品ID', '商家编码', '商品单价', '订单应付金额', '平台优惠', '商家优惠',
        '支付方式', '省', '市', '区', '街道', '支付完成时间', '流量来源', '订单状态',
        '达人ID', '达人昵称', '售后状态', '广告渠道', '流量类型', '流量体裁', '流量渠道',
        '发货时间', '降价类优惠', '平台实际承担优惠金额', '商家实际承担优惠金额',
        '达人实际承担优惠金额', '是否福袋订单', '渠道', '电煮锅'
    ]]

    # 数据清洗
    dou_date = dou_date.map(lambda x: str(x).strip())

    return dou_date


def insert_to_database(dou_date):
    """插入数据到数据库"""
    # 数据库连接
    db = pymysql.connect(host="localhost", user="root", password="hui123456", db='dbtest')
    cursor = db.cursor()

    try:
        # SQL插入语句
        insert_sql = '''
            INSERT INTO doudian_day VALUES 
            (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,
             %s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
        '''

        # 批量插入数据
        for val in dou_date.values:
            cursor.execute(insert_sql, tuple(val))

        db.commit()
        print(f"成功插入 {len(dou_date)} 条记录到数据库")

    except Exception as e:
        db.rollback()
        print(f"数据插入失败: {e}")
        raise
    finally:
        cursor.close()
        db.close()


def main():
    """主函数"""
    try:
        # 加载抖音数据
        dou = load_douyin_data()

        # 数据处理
        dou_date = process_data(dou)

        # 插入数据库
        insert_to_database(dou_date)

        print("数据处理和导入完成")

    except Exception as e:
        print(f"程序执行出错: {e}")


if __name__ == "__main__":
    main()
